typedef LONG NTSTATUS;
#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

#define FILE_DEVICE_NULL                0x00000015
#define METHOD_BUFFERED					0
#define FILE_ANY_ACCESS					0
#define IOCTL_VCRYD_MOUNT_VOLUME CTL_CODE( FILE_DEVICE_NULL, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
//IOCL for dismountig volume
#define IOCTL_VCRYD_DISMOUNT_VOLUME CTL_CODE( FILE_DEVICE_NULL, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
//IOCL reserved in case of growing project
#define IOCTL_VCRYD_RESERVE_VOLUME CTL_CODE(FILE_DEVICE_NULL, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)

//should be sent with IOCL mount IRP
typedef struct _OPEN_FILE_INFORMATION {
	LARGE_INTEGER   FileSize;
	BOOLEAN         ReadOnly;
	UCHAR           DriveLetter;
	USHORT          FileNameLength;
	CHAR           FileName[1];      //? should be a pointer
	//Unicode string maybe
} OPEN_FILE_INFORMATION, *POPEN_FILE_INFORMATION;


typedef struct _VCRYD_FILE_HEADER {
	CHAR password[24];
	CHAR key[24];
} VCRYD_FILE_HEADER, *PVCRYD_FILE_HEADER;


#define HEADER_OFFSET 0


NTSTATUS vcrydMount(LPCWCHAR fileName,UCHAR desiredLetter);
NTSTATUS vcrydDismount(UCHAR letter);

